package model.trivial_pursuit;

import java.sql.SQLException;
import java.util.LinkedList;

import model.Params;

import database.IDbConnector;
import database.MySQLConnector;
import database.TypedAttribute;
import database.ValuedAttribute;

/**
 * Classe permettant de créer les tables dans la base de données principale
 * @author Aubry Pirian
 * version 1.0
 */
public class DbTPInstaller {
	
	private IDbConnector idbc;		// Objet de connexion
	
	private String[] tableName;
	
	/**
	 * Initialise les noms des tables pour le tableau tableName
	 */
	public void init () {
		// Table names
		tableName = new String[3];
		tableName[TPParams.THEME_ID] = TPParams.THEME_TABLE;
		tableName[TPParams.CARD_ID] = TPParams.CARD_TABLE;
		tableName[TPParams.ANSWERED_ID] = TPParams.ANSWERED_TABLE;
	}
	
	/**
	 * Constructeur de la classe
	 * Crée automatiquement les tables
	 */
	public DbTPInstaller () {
		this.install(false);
	}
	
	/**
	 * Constructeur de la classe
	 * Crée automatiquement les tables, en effaçant éventuellement les tables déjà présentes
	 * @param force : true s'il faut effacer les tables, false sinon 
	 */
	public DbTPInstaller (boolean force) {
		this.install(force);
	}
	
	/**
	 * Lance l'installation, en effaçant éventuellement les tables déjà présentes 
	 * @param force : true s'il faut effacer les tables, false sinon
	 */
	private void install (boolean force) {
		try {
			this.idbc = new MySQLConnector(Params.DB_SERVER,Params.DB_USER,Params.DB_PASSWD,Params.DB_NAME);
		} catch (NoSuchFieldException e1) {
			//TODO
			e1.printStackTrace();
		}
		try {
			this.idbc.connect();
		} catch (ClassNotFoundException e) {
			System.err.println("Echec de la connexion à la base de données.");
//			e.printStackTrace();
		} catch (SQLException e) {
			System.err.println("Echec de la connexion à la base de données.");
		}
		this.init();
		int tCount = TPParams.TABLE_ATTRIBUTES.length;
		if (force) {
			for (int t=0; t<tCount; t++) {
				try {
					this.idbc.dropTable(tableName[t]);
				} catch (SQLException e) {
					System.err.println("Impossible de supprimer la table.");
	//				e.printStackTrace();
				} catch (Exception e) {
					System.err.println("Impossible de supprimer la table.");
	//				e.printStackTrace();
				}
			}
		}
		for (int t=0; t<tCount; t++) {
			try {
				this.createTable(t);
			} catch (SQLException e) {
				System.err.println("Impossible de créer la table.");
//				e.printStackTrace();
			} catch (Exception e) {
				System.err.println("Impossible de créer la table.");
//				e.printStackTrace();
			}
		}
		LinkedList<ValuedAttribute> values = new LinkedList<ValuedAttribute>();
		try {
			values.add( new ValuedAttribute("id",1));
			values.add( new ValuedAttribute("name","Trivial Pursuit"));
			values.add( new ValuedAttribute("status","visible"));
		} catch (NoSuchFieldException e) {
			System.err.println("Impossible de créer l'attribut : paramètre non valide.");
		}
		try {
			this.idbc.insert(Params.GAME_TABLE,values);
		} catch (SQLException e) {
			System.out.println("Erreur SQL n°"+e.getErrorCode()+": "+e.getMessage());
		} catch (NoSuchFieldException e) {
			System.err.println("Impossible d'ajouter le jeu dans la base de données.");
		}
	}
	
	/**
	 * Crée la table numéro 'table'
	 * @param tableId		: numéro de la table à créer
	 * @throws SQLException
	 * @throws Exception
	 */
	private void createTable (int tableId) throws SQLException, Exception {
		String tName = tableName[tableId];
		LinkedList<TypedAttribute> attributes = new LinkedList<TypedAttribute>();
		int aCount = TPParams.TABLE_ATTRIBUTES[tableId].length;
		for (int a=0; a<aCount; a++) {
			this.appendAttribute(attributes,TPParams.TABLE_ATTRIBUTES[tableId][a]);
		}
		this.idbc.createTable(tName, attributes);
	}
	
	/**
	 * Ajoute à la liste l'attribut du tableau TABLE_ATTRIBUTES
	 * @param list	: liste d'Attributes
	 * @param table : index de la table dans le tableau
	 * @param att	: index de l'attribut dans le tableau
	 * @throws Exception 
	 */
	private void appendAttribute (LinkedList<TypedAttribute> list, String[] attribute) throws Exception {
		// for (int i=0; i<attribute[i].length; i++) System.out.println(attribute[i]);
		boolean notNull = false;
		boolean autoIncrement = false;
		TypedAttribute ta;
		if (attribute[4].equals("true")) notNull=true;
		if (attribute[5].equals("true")) autoIncrement=true;
		if (attribute.length>6) {
			char k = attribute[6].charAt(0);
			ta = new TypedAttribute(attribute[0],attribute[1],attribute[2],attribute[3],notNull,autoIncrement,k); 
		} else {
			ta = new TypedAttribute(attribute[0],attribute[1],attribute[2],attribute[3],notNull,autoIncrement);
		}
		list.add(ta);
	}

	
	public static void main(String[] args) {
		if (args.length>0) {
			if (args[0].equalsIgnoreCase("-f"));
			new DbTPInstaller(true);
		} else {
			new DbTPInstaller();
		}
	}

}
